package it.sda.sviluppi.service;

import it.sda.sviluppi.bean.ArtefattoBean;
import it.sda.sviluppi.bean.SviluppoBean;
import it.sda.sviluppi.dto.Artefatto;
import it.sda.sviluppi.dto.ArtefattoExample;
import it.sda.sviluppi.dto.ArtefattoProgetto;
import it.sda.sviluppi.dto.ArtefattoProgettoExample;
import it.sda.sviluppi.dto.ArtefattoProgettoKey;
import it.sda.sviluppi.dto.Progetto;
import it.sda.sviluppi.dto.ProgettoExample;
import it.sda.sviluppi.dto.Referente;
import it.sda.sviluppi.dto.Risorsa;
import it.sda.sviluppi.dto.RisorsaExample;
import it.sda.sviluppi.dto.Sviluppo;
import it.sda.sviluppi.dto.SviluppoArtefatto;
import it.sda.sviluppi.dto.SviluppoArtefattoExample;
import it.sda.sviluppi.dto.SviluppoExample;
import it.sda.sviluppi.dto.SviluppoRisorsaExample;
import it.sda.sviluppi.dto.SviluppoRisorsaKey;
import it.sda.sviluppi.mapper.ArtefattoMapper;
import it.sda.sviluppi.mapper.ArtefattoProgettoMapper;
import it.sda.sviluppi.mapper.ProgettoMapper;
import it.sda.sviluppi.mapper.ReferenteMapper;
import it.sda.sviluppi.mapper.RisorsaMapper;
import it.sda.sviluppi.mapper.SviluppoArtefattoMapper;
import it.sda.sviluppi.mapper.SviluppoMapper;
import it.sda.sviluppi.mapper.SviluppoRisorsaMapper;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

public class SviluppoService {
	@Autowired
	private ArtefattoMapper          	artefattoMapper      	;
	@Autowired
	private ArtefattoProgettoMapper		artefattoProgettoMapper;
	@Autowired
	private ProgettoMapper				progettoMapper; 
	@Autowired
	private ReferenteMapper       	 	referenteMapper     ;
	@Autowired
	private RisorsaMapper            	risorsaMapper          ;
	@Autowired
	private SviluppoMapper           	sviluppoMapper         ;
	@Autowired
	private SviluppoArtefattoMapper  	sviluppoArtefattoMapper;
	@Autowired
	private SviluppoRisorsaMapper    	sviluppoRisorsaMapper  ; 

		
	/**
	 * 
	 * @return
	 * @throws Exception
	 */
	public List<SviluppoBean> getSviluppi() throws Exception{
		try{
			List<SviluppoBean> sviluppiBean = new ArrayList<SviluppoBean>();
			List<Sviluppo> sviluppi=  sviluppoMapper.selectByExample(new SviluppoExample());
			if(!sviluppi.isEmpty()){
				for (Sviluppo sviluppo : sviluppi) {
					Referente referente 		= getReferente(sviluppo);
					List<Artefatto> artefatti 	= getArtefatti(sviluppo);
					List<Risorsa> risorse 		= getRisorse(sviluppo);
					sviluppiBean.add(new SviluppoBean(sviluppo, artefatti, referente, risorse));
				}
			}
			return sviluppiBean;
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		}
	}
	/**
	 * 
	 * @param sviluppo
	 * @return
	 * @throws Exception
	 */
	private List<ArtefattoBean> getArtefatti(Sviluppo sviluppo) throws Exception {
		SviluppoArtefattoExample sviArtWhere  = new SviluppoArtefattoExample();
		sviArtWhere.createCriteria().andIdSviluppoEqualTo(sviluppo.getIdSviluppo());
		List<SviluppoArtefatto> sviluppiArtefatti = sviluppoArtefattoMapper.selectByExample(sviArtWhere);
		List<Integer> idArtefatti = new ArrayList<Integer>();
		for (SviluppoArtefatto sviluppoArtefatto : sviluppiArtefatti) {
			ArtefattoExample artWhere = new ArtefattoExample();
			artWhere.createCriteria().andIdArtefattoIn(idArtefatti);
			Artefatto artefatto = artefattoMapper.selectByPrimaryKey(sviluppoArtefatto.getIdArtefatto());
			List<ProgettoBean> progetti = getProgetti(artefatto);
			ArtefattoBean artefattoBean = new ArtefattoBean(artefatto.getNome(), 
														sviluppoArtefatto.getVersione(), 
														sviluppoArtefatto.getDataRilascioIntegrazione(), 
														sviluppoArtefatto.getDataRialscioCollaudo(), 
														sviluppoArtefatto.getDataRilascioProduzione(), 
														branch, 
														dataMerge, 
														progetti);
			
		}
		return null;
	}
	public ArtefattoProgetto setBranchMergeArtefatto(Artefatto artefatto) throws Exception{
		ProgettoExample progettoWhere = new ProgettoExample();
		progettoWhere.createCriteria().andNomeEqualTo(artefatto.getNome()).andAttivoEqualTo((byte)0);
		List<Progetto> progetto = progettoMapper.selectByExample(progettoWhere);
		artefattoProgettoMapper.selectByPrimaryKey(key)
	}
	
	/**
	 * 
	 * @param sviluppo
	 * @return
	 * @throws Exception
	 */
	private List<ProgettoBean> getProgetti(Artefatto artefatto) throws Exception {
		ArtefattoProgettoExample sviArtWhere  = new ArtefattoProgettoExample();
		sviArtWhere.createCriteria().andIdArtefattoEqualTo(progetto.getIdArtefatto());
		List<ArtefattoProgetto> artefattiProgetti =  artefattoProgettoMapper.selectByExample(sviArtWhere);
		List<Integer> idProgetti = new ArrayList<Integer>();
		for (ArtefattoProgettoKey progettoProgettoKey : artefattiProgetti) {
			idProgetti.add(progettoProgettoKey.getIdProgetto());
		}
		if(!idProgetti.isEmpty()){
			ProgettoExample artWhere = new ProgettoExample();
			artWhere.createCriteria().andIdProgettoIn(idProgetti);
			return progettoMapper.selectByExample(artWhere);
		}
		return null;
	}
	
	/**
	 * 
	 * @param sviluppo
	 * @return
	 * @throws Exception
	 */
	private List<Risorsa> getRisorse(Sviluppo sviluppo) throws Exception {
		SviluppoRisorsaExample sviArtWhere  = new SviluppoRisorsaExample();
		sviArtWhere.createCriteria().andIdSviluppoEqualTo(sviluppo.getIdSviluppo());
		List<SviluppoRisorsaKey> sviluppiRisorse =  sviluppoRisorsaMapper.selectByExample(sviArtWhere);
		List<Integer> idRisorse = new ArrayList<Integer>();
		for (SviluppoRisorsaKey sviluppoRisorsaKey : sviluppiRisorse) {
			idRisorse.add(sviluppoRisorsaKey.getIdRisorsa());
		}
		if(!idRisorse.isEmpty()){
			RisorsaExample artWhere = new RisorsaExample();
			artWhere.createCriteria().andIdRisorsaIn(idRisorse);
			return risorsaMapper.selectByExample(artWhere);
		}
		return null;
	}



	private Referente getReferente(Sviluppo sviluppo) throws Exception {
		return referenteMapper.selectByPrimaryKey(sviluppo.getIdReferente());
	}  
	
	
}
